﻿using Seg.Entidades;
using Seg.Logica;
using Seg.MenuComp;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Seg.Componente
{
    public class Menu
    {

        List<OpcionDTO> n2 = new List<OpcionDTO>(); StringBuilder html = new StringBuilder();

        public string CargarMenu(int CodigoPerfil, string prefijo, int CodigoUsuarioOficina, int CodigoPerdilUsuario,string paginaPrincipal)
        {
                List<OpcionDTO> n1 = new List<OpcionDTO>();
                int CodigoSistema = 0;
                var objsis = new SistemaLogica().obtenerXPrefijo(prefijo);
                if (objsis == null)  return "(*)No se encontró sistema para cargar opciones";
                CodigoSistema = objsis.CodigoSistema;
               
               List<SEGSS_OPCIONES_MENU_Result> opciones= new PerfilOpcionLogica().OpcionesPerfil(CodigoPerdilUsuario, CodigoPerfil);
               if (opciones != null) {
                   opciones.ForEach(x =>
                   {
                       if (x.TipoAcceso != "N")
                       {
                           OpcionDTO obj = new OpcionDTO()
                           {
                               Nivel = x.Nivel,
                               Nombre = x.Nombre,
                               Descripcion = x.Descripcion,
                               CodigoOpcion = x.CodigoOpcion,
                               CodigoOpcionPadre = x.CodigoOpcionPadre,
                               Ruta = x.Ruta,
                               TipoAcceso=x.TipoAcceso
                           };
                           if (obj.Nivel == 1)
                               n1.Add(obj);
                           else
                               n2.Add(obj);
                       }
                   });
               }
               else
               {
                   return "(*)No se encontraron opciones para perfiles.";
               }

                    if (n1 == null) return "(-999)No se encontraron opciones.";
                    if (n1 != null && n1.Count == 0) return "(-999)No se encontraron opciones.";
                    //if (n2 == null) return "(*)No se encontraron opciones..";
                    //if (n2 != null && n2.Count == 0) return "(*)No se encontraron opciones..";

                    ///begin lista opciones recursiva
                    if (n1 != null)
                    {
                        html.Append("<div id='cssmenu'><ul>");
                        n1.ForEach(c =>
                        {
                            var clase = "";
                            clase = n2 != null ? "has-sub" : "active";
                            html.AppendFormat("<li class='{0}'><a href='#'><span>{1}</span></a>", clase, c.Nombre);

                            if (n2 != null)
                            {
                                n2 = n2.OrderBy(z => z.CodigoOpcionPadre).ToList();
                                html.Append("<ul>");

                                n2.ForEach(nivel2 =>
                                {
                                    if (c.CodigoOpcion == nivel2.CodigoOpcionPadre)
                                    {
                                        if (tieneHijos(nivel2.CodigoOpcion))
                                        {
                                            var clase2 = "";
                                            clase2 = n2 != null ? "has-sub" : "active";
                                            html.AppendFormat("<li class='{0}'><a href='#'><span style='font-weight:bold;'>{1}</span></a>", clase2, nivel2.Nombre);

                                            html.Append("<ul>");
                                            n2.ForEach(nivel3 =>
                                            {
                                                if (nivel2.CodigoOpcion == nivel3.CodigoOpcionPadre)
                                                {
                                                    if (tieneHijos(nivel3.CodigoOpcion))
                                                    {
                                                        var clase3 = "";
                                                        clase3 = n2 != null ? "has-sub" : "active";
                                                        html.AppendFormat("<li class='{0}'><a href='#'><span style='font-weight:bold;'>{1}</span></a>", clase3, nivel3.Nombre);
                                                        html.Append("<ul>");
                                                        n2.ForEach(nivel4 =>
                                                        {
                                                            if (nivel3.CodigoOpcion == nivel4.CodigoOpcionPadre)
                                                            {
                                                                if (tieneHijos(nivel4.CodigoOpcion))
                                                                {
                                                                    var clase4 = "";
                                                                    clase4 = n2 != null ? "has-sub" : "active";
                                                                    html.AppendFormat("<li class='{0}'><a href='#'><span style='font-weight:bold;'>{1}</span></a>", clase4, nivel4.Nombre);
                                                                    html.Append("<ul>");

                                                                    n2.ForEach(nivel5 =>
                                                                    {
                                                                        if (nivel4.CodigoOpcion == nivel5.CodigoOpcionPadre)
                                                                        {
                                                                            html.AppendFormat("<li class='active'><a href='{0}' title='{1}'><span>{2} </span></a></li>", nivel5.Ruta, nivel5.Descripcion, nivel5.Nombre);
                                                                        }
                                                                    });
                                                                    html.Append("</ul>");
                                                                    html.Append("</li>");
                                                                }
                                                                else
                                                                    html.AppendFormat("<li class='active'><a href='{0}' title='{1}'><span>{2} </span></a></li>", nivel4.Ruta, nivel4.Descripcion, nivel4.Nombre);
                                                            }
                                                        });
                                                        html.Append("</ul>");
                                                        html.Append("</li>");
                                                    }
                                                    else
                                                        html.AppendFormat("<li class='active'><a href='{0}' title='{1}'><span>{2}</span></a></li>", nivel3.Ruta, nivel3.Descripcion, nivel3.Nombre);
                                                }
                                            });
                                            html.Append("</ul>");
                                            html.Append("</li>");
                                        }
                                        else
                                            html.AppendFormat("<li class='active'><a href='{0}' title='{1}'><span>{2}</span></a></li>", nivel2.Ruta, nivel2.Descripcion, nivel2.Nombre);
                                            //html.AppendFormat("<li class='active'><a href='{0}?optAcc={3}&mode={4}' title='{1}'><span>{2}</span></a></li>", nivel2.Ruta, nivel2.Descripcion, nivel2.Nombre, new UIEncriptador().EncriptarCadena(Convert.ToString(nivel2.CodigoOpcion)), new UIEncriptador().EncriptarCadena(nivel2.TipoAcceso));
                                    }
                                });
                                html.Append("</ul>");
                            }
                            html.Append("</li>");
                        });
                        ///end  lista opciones recursiva

                        ///begin lista modulo y perfil

                        List<SEGSS_PERFILUSUARIO_X_CODIGO_Result> listaPerfil = new PerfilLogistica().ListaPerfilXSistema(CodigoUsuarioOficina,prefijo);
                        List<PerfilDTO> perfiles = new List<PerfilDTO>();
                        List<int?> codModulos = new List<int?>();
                        int? codModuloAnt = 0;
                        listaPerfil.ForEach(c =>
                            {
                                PerfilDTO per = new PerfilDTO();
                                per.CodigoPerfil =  c.CodigoPerfil;
                                per.Nombre = c.NombrePerfil;
                                per.CodigoModulo = c.CodigoModulo; 
                                per.CodigoPerfilUsuario=c.CodigoPerfilUsuarioOfi;
                                perfiles.Add(per);
                             });
                        List<Modulo> modulos = new List<Modulo>();
                        listaPerfil.ForEach(c =>
                            {
                                if (c.CodigoModulo != codModuloAnt)
                                {
                                    codModulos.Add(c.CodigoModulo);
                                    Modulo modulo = new Modulo();
                                    modulo.CodigoModulo = c.CodigoModulo;
                                    modulo.Nombre = c.NombreModulo;
                                    modulos.Add(modulo);
                                }
                                codModuloAnt = c.CodigoModulo;
                            });

                        var cl = codModulos != null ? "has-sub" : "active";
                        html.AppendFormat("<li class='{0}'><a href='#'><span>Modulos</span></a>", cl);
                        if (modulos != null)
                        {
                            html.Append("<ul>");
                            modulos.ForEach(c =>
                            {
                                if (perfiles != null)
                                {
                                    var count  = 0;
                                    perfiles.ForEach(x =>{if (x.CodigoModulo == c.CodigoModulo) count++;});
                                    var cl2 = count != 0 ? "has-sub" : "active";
                                    html.AppendFormat("<li class='{0}'><a href='#'><span>{1}</span></a>", cl2, c.Nombre);
                                    if (count != 0)
                                    {
                                        html.Append("<ul>");
                                        perfiles.ForEach(x =>
                                        {
                                            if (x.CodigoModulo == c.CodigoModulo)
                                            {
                                                List<SEGSS_OPCIONES_MENU_Result> opcionesCuenta = new PerfilOpcionLogica().OpcionesPerfil(x.CodigoPerfilUsuario, x.CodigoPerfil);
                                                int cuenta = 0;
                                                if (opcionesCuenta != null) opcionesCuenta.ForEach(item => {if (item.TipoAcceso != "N" && item.Nivel==1) { cuenta = cuenta + 1; } });
                                                if (cuenta > 0)
                                                {
                                                    html.AppendFormat("<li class='active'><a href='{4}?idPer={0}&idSis={1}&idPerUsu={3}'  title='Cambiar de perfil.' ><span>{2}</span></a></li>", x.CodigoPerfil, CodigoSistema, x.Nombre,x.CodigoPerfilUsuario,paginaPrincipal);
                                                }
                                                else {
                                                    html.AppendFormat("<li class='active'><a href='#' title='No tiene opciones asignadas.' alt='title='No tiene opciones asignadas'' ><span>{0}</span></a></li>", x.Nombre);
                                                }
                                            }
                                        });
                                        html.Append("</ul>");
                                    }
                                }
                                html.Append("</li>");
                            });
                            html.Append("</ul>");
                        }
                        html.Append("</li>");
                        html.Append("</ul></div>");
                        ///fin lista modulo y perfil
                    }
                 
            return html.ToString();
        }
        public bool tieneHijos(int CodigoOpcion)
        {

            int cuenta = 0;

            n2.ForEach(x =>
            {
                if (CodigoOpcion == x.CodigoOpcionPadre)
                {
                    cuenta++;
                }

            });
            if (cuenta == 0) return false;
            else return true;
        }

        public string getDescripcionPerfil(int idPerfil){

            string descripcion = "-";
            var obj=new PerfilLogistica().ObtenerPerfil(idPerfil);
            if(obj!=null){
                descripcion = obj.Nombre;
            }
            return descripcion;
        }
        public string getDescripcionOficina(int idPerfilUsuario)
        {

            string descripcion = "-";
            var obj = new PerfilUsuarioOficinaLogica().obtenerPerfilUsuarioOficinaXCodPerf(idPerfilUsuario);
            if (obj != null && obj.UsuarioOficina != null && obj.UsuarioOficina.Oficina != null)
                descripcion = obj.UsuarioOficina.Oficina.Nombre;
            return descripcion;
        }
        
    }
}
 